apply plugin: 'idea'
apply plugin: 'eclipse'
{{#sourceFolder}}
apply plugin: 'java'
{{/sourceFolder}}
apply plugin: 'com.diffplug.spotless'

group = '{{groupId}}'
version = '{{artifactVersion}}'

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.+'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
        classpath 'com.diffplug.spotless:spotless-plugin-gradle:6.11.0'
    }
}

repositories {
    mavenCentral()
}
{{#sourceFolder}}
sourceSets {
    main.java.srcDirs = ['{{sourceFolder}}']
}

{{/sourceFolder}}
if(hasProperty('target') && target == 'android') {

    apply plugin: 'com.android.library'
    apply plugin: 'com.github.dcendents.android-maven'

    android {
        compileSdkVersion 25
        buildToolsVersion '25.0.2'
        defaultConfig {
            minSdkVersion 14
            targetSdkVersion 25
        }
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }

        // Rename the aar correctly
        libraryVariants.all { variant ->
            variant.outputs.each { output ->
                def outputFile = output.outputFile
                if (outputFile != null && outputFile.name.endsWith('.aar')) {
                    def fileName = "${project.name}-${variant.baseName}-${version}.aar"
                    output.outputFile = new File(outputFile.parent, fileName)
                }
            }
        }

        dependencies {
            provided "jakarta.annotation:jakarta.annotation-api:$jakarta_annotation_version"
        }
    }

    afterEvaluate {
        android.libraryVariants.all { variant ->
            def task = project.tasks.create "jar${variant.name.capitalize()}", Jar
            task.description = "Create jar artifact for ${variant.name}"
            task.dependsOn variant.javaCompile
            task.from variant.javaCompile.destinationDirectory
            task.destinationDirectory = project.file("${project.buildDir}/outputs/jar")
            task.archiveFileName = "${project.name}-${variant.baseName}-${version}.jar"
            artifacts.add('archives', task)
        }
    }

    task sourcesJar(type: Jar) {
        from android.sourceSets.main.java.srcDirs
        classifier = 'sources'
    }

    artifacts {
        archives sourcesJar
    }

} else {

    apply plugin: 'java'
    apply plugin: 'maven-publish'

    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8

    publishing {
        publications {
            maven(MavenPublication) {
               artifactId = '{{artifactId}}'
               from components.java
            }
        }
    }

    task execute(type:JavaExec) {
       main = System.getProperty('mainClass')
       classpath = sourceSets.main.runtimeClasspath
    }
}

ext {
    {{#swagger1AnnotationLibrary}}
    swagger_annotations_version = "1.6.9"
    {{/swagger1AnnotationLibrary}}
    {{#swagger2AnnotationLibrary}}
    swagger_annotations_version = "2.2.9"
    {{/swagger2AnnotationLibrary}}
    jakarta_annotation_version = "1.3.5"
    {{#useBeanValidation}}
    bean_validation_version = "2.0.2"
    {{/useBeanValidation}}
}

dependencies {
    {{#swagger1AnnotationLibrary}}
    implementation "io.swagger:swagger-annotations:$swagger_annotations_version"
    {{/swagger1AnnotationLibrary}}
    {{#swagger2AnnotationLibrary}}
    implementation "io.swagger.core.v3:swagger-annotations:$swagger_annotations_version"
    {{/swagger2AnnotationLibrary}}
    implementation "com.google.code.findbugs:jsr305:3.0.2"
    implementation 'com.squareup.okhttp3:okhttp:4.12.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
    implementation 'com.google.code.gson:gson:2.9.1'
    implementation 'io.gsonfire:gson-fire:1.9.0'
    implementation 'jakarta.ws.rs:jakarta.ws.rs-api:2.1.6'
    {{#openApiNullable}}
    implementation 'org.openapitools:jackson-databind-nullable:0.2.8'
    {{/openApiNullable}}
    {{#withAWSV4Signature}}
    implementation 'software.amazon.awssdk:auth:2.20.157'
    {{/withAWSV4Signature}}
    {{#hasOAuthMethods}}
    implementation group: 'org.apache.oltu.oauth2', name: 'org.apache.oltu.oauth2.client', version: '1.0.2'
    {{/hasOAuthMethods}}
    implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.18.0'
    {{#joda}}
    implementation 'joda-time:joda-time:2.9.9'
    {{/joda}}
    {{#dynamicOperations}}
    implementation 'io.swagger.parser.v3:swagger-parser-v3:2.0.30'
    {{/dynamicOperations}}
    implementation "jakarta.annotation:jakarta.annotation-api:$jakarta_annotation_version"
    {{#useBeanValidation}}
    implementation "jakarta.validation:jakarta.validation-api:$bean_validation_version"
    {{/useBeanValidation}}
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.3'
    testImplementation 'org.mockito:mockito-core:3.12.4'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.3'
}

javadoc {
    options.tags = [ "http.response.details:a:Http Response Details" ]
}

// Use spotless plugin to automatically format code, remove unused import, etc
// To apply changes directly to the file, run `gradlew spotlessApply`
// Ref: https://github.com/diffplug/spotless/tree/main/plugin-gradle
spotless {
    // comment out below to run spotless as part of the `check` task
    enforceCheck false

    format 'misc', {
        // define the files (e.g. '*.gradle', '*.md') to apply `misc` to
        target '.gitignore'

        // define the steps to apply to those files
        trimTrailingWhitespace()
        indentWithSpaces() // Takes an integer argument if you don't like 4
        endWithNewline()
    }
    java {
        // don't need to set target, it is inferred from java

        // apply a specific flavor of google-java-format
        googleJavaFormat('1.8').aosp().reflowLongStrings()

        removeUnusedImports()
        importOrder()
    }
}

test {
    // Enable JUnit 5 (Gradle 4.6+).
    useJUnitPlatform()

    // Always run tests, even when nothing changed.
    dependsOn 'cleanTest'

    // Show test results.
    testLogging {
        events "passed", "skipped", "failed"
    }

}
